package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"time"
)

//hello world
//func main() {
//	r := gin.Default()
//	r.GET("/", func(c *gin.Context) {
//		c.String(200, "hello world")
//	})
//	r.Run("127.0.0.1:8888")
//}

//解析路径参数
//func main() {
//	r := gin.Default()
//	r.GET("/user/:name", func(c *gin.Context) {
//		name := c.Param("name")
//		c.String(200, "hello,%s", name)
//	})
//	if err := r.Run(); err != nil {
//		fmt.Println(err)
//	}
//}

//获取Query参数
//func main() {
//	r := gin.Default()
//	r.GET("/users", func(c *gin.Context) {
//		name := c.Query("name")
//		role := c.DefaultQuery("role", "teacher")
//		c.String(200, "%s is a %s", name, role)
//	})
//	r.Run()
//}

//获取POST参数(form表单)
//func main() {
//	r := gin.Default()
//	r.POST("/form", func(c *gin.Context) {
//		username := c.PostForm("name")
//		password := c.PostForm("password")
//		c.JSON(200, gin.H{
//			"name":     username,
//			"password": password,
//		})
//	})
//	r.Run()
//}

//Query和POST混合参数
//func main() {
//	r := gin.Default()
//	r.POST("/posts", func(c *gin.Context) {
//		id := c.Query("id")
//		page := c.DefaultQuery("page", "0")
//		username := c.PostForm("username")
//		password := c.DefaultPostForm("password", "0000000")
//		c.JSON(200, gin.H{
//			"name": username,
//			"pass": password,
//			"id":   id,
//			"page": page,
//		})
//	})
//	r.Run()
//}

//Map参数(字典参数)
//func main() {
//	r := gin.Default()
//	r.POST("/post", func(c *gin.Context) {
//		ids := c.QueryMap("ids")
//		names := c.PostFormMap("names")
//
//		c.JSON(http.StatusOK, gin.H{
//			"ids":   ids,
//			"names": names,
//		})
//	})
//	r.Run()
//}

//重定向(Redirect)
//func main() {
//	r := gin.Default()
//	r.GET("/", func(c *gin.Context) {
//		c.Redirect(301, "https://www.baidu.com")
//	})
//	r.Run()
//}

//分组路由(Grouping Routes)
//func main() {
//	defaultHandler := func(c *gin.Context) {
//		c.JSON(http.StatusOK, gin.H{
//			"path": c.FullPath(),
//		})
//	}
//	r := gin.Default()
//	v1 := r.Group("/v1")
//	{
//		v1.GET("posts", defaultHandler)
//		v1.GET("series", defaultHandler)
//	}
//	r.GET("/v1", defaultHandler)
//	v2 := r.Group("/v2")
//	{
//		v2.GET("/posts", defaultHandler)
//		v2.GET("/series", defaultHandler)
//	}
//	r.Run()
//}

//上传文件
//func main() {
//	r := gin.Default()
//	r.POST("/upload1", func(c *gin.Context) {
//		file, err := c.FormFile("file")
//		if err != nil {
//			fmt.Println(err)
//			return
//		}
//		c.String(200, "%s uploaded", file.Filename)
//	})
//	r.Run()
//}

//上传多个文件
//func main() {
//	r := gin.Default()
//	r.POST("/upload2", func(c *gin.Context) {
//		form, _ := c.MultipartForm()
//		files := form.File["uploads"]
//		for _, file := range files {
//			log.Println(file.Filename)
//		}
//		c.String(200, "%d files uploaded!", len(files))
//	})
//	r.Run()
//}

//HTML模板(template)

//func main() {
//	type student struct {
//		Name string
//		Age  int8
//	}
//
//	r := gin.Default()
//	r.LoadHTMLGlob("./*tmpl")
//	stu1 := &student{
//		Name: "weiqwei",
//		Age:  27,
//	}
//	stu2 := &student{
//		Name: "Gin",
//		Age:  0,
//	}
//	r.GET("/arr", func(c *gin.Context) {
//		c.HTML(200, "arr.tmpl", gin.H{
//			"title":  "Gin",
//			"stuArr": [2]*student{stu1, stu2},
//		})
//	})
//	r.GET("/arr2", func(c *gin.Context) {
//		c.HTML(200, "arr2.tmpl", gin.H{
//			"title":  "Gin",
//			"stuArr": [2]*student{stu1, stu2},
//		})
//	})
//	r.Run()
//}

//中间件(middleWare)
func main() {
	r := gin.Default()
	//r.Use(Logger())
	r.GET("/benchmark", Logger(), func(c *gin.Context) {
		c.String(200, "hah")
	})
	authorized := r.Group("/")
	authorized.Use(AuthRequired())
	{
		authorized.GET("/login", func(c *gin.Context) {
			c.String(200, "hah")
		})
		authorized.POST("/submit", func(c *gin.Context) {
			c.String(200, "hah")
		})
	}
	r.Run()
}
func AuthRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		fmt.Println("pass")
		c.Next()
	}
}
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		// 给Context实例设置一个值
		c.Set("geektutu", "1111")
		// 请求前
		c.Next()
		// 请求后
		latency := time.Since(t)
		log.Print(latency)
	}
}
